<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // Promise
    // Promise 是异步编程的一种解决方案，比传统的解决方案——回调函数和事件——更合理和更强大

    // Promise如何处理异步操作?
    // 所谓Promise，简单说就是一个容器，里面保存着某个未来才会结束的事件（通常是一个异步操作）的结果。从语法上说，Promise 是一个对象，从它可以获取异步操作的消息。

    // 如何使用Promise?  => new Promise()中传入一个回调函数
    // p => new Promise()创建的实例化对象(实例化是指在面向对象的编程中，把用类创建对象的过程称为实例化)  => p 简称Promise实例 Promise对象
    // var p = new Promise(function () {
    //     // 回调函数 -> 容器 -> 需要执行的异步操作(同步也可以)
    // });
    // console.log(p);
    // p => {
    //     [[PromiseState]]:"pending", // Promise实例的 状态
    //     [[PromiseResult]]:undefined // Promise实例的 结果
    // }

    // Promise实例的状态:
    // pending(进行中)
    // fulfilled / resolved(已成功)
    // rejected(已失败)

    // 三个状态分别对应 异步请求的流程和结果

    // 如何改变Promise的状态?
    // Promise提供了改变状态的方法 => 使用者根据异步操作的结果自行决定如何改变状态
    // resolve()  可以将Promise实例由pending(进行中)改为fulfilled(已成功)
    // reject()  可以将Promise实例由pending(进行中)改为rejected(已失败)

    // resolve()  reject() 除了可以改变状态,还可以接收一个实参作为Promise实例中存储的数据

    // 同步代码: 调用resolve(), reject()立即改变状态
    // debugger;
    // var p = new Promise(function (resolve, reject) {
    //     // 回调函数(同步任务) -> 容器 -> 存放需要执行的异步操作(同步也可以)
    //     // resolve()  可以将Promise实例由pending(进行中)改为fulfilled(已成功)
    //     // reject()  可以将Promise实例由pending(进行中)改为rejected(已失败)
    //     console.log("代码开始:1");
    //     // resolve(1);  //  同步代码: 立即改变状态
    //     reject(2);
    //     console.log("代码结束:3");
    // });
    // console.log(p);  // {fulfilled:undefined}





    // 异步代码: 等所有同步任务执行完毕 => 异步操作开始执行 => 调用resolve(), reject()才会改变状态 (未来改变状态)
    debugger;
    var p = new Promise(function (resolve, reject) {
        // 回调函数(同步任务) -> 容器 -> 存放需要执行的异步操作(同步也可以)
        // resolve()  可以将Promise实例由pending(进行中)改为fulfilled(已成功)
        // reject()  可以将Promise实例由pending(进行中)改为rejected(已失败)
        console.log("代码开始:1");

        setTimeout(function () {
            debugger;
            console.log("异步开始:1");
            resolve(1);  //  {fulfilled:1} 异步代码: 未来改变状态
            // reject(2); ////  {rejected:2}
            console.log("异步开始:", p);
        }, 2000);

        console.log("代码结束:3");
    });
    console.log("同步:", p);  // {pending:undefined}






</script>

</html>